/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import java.net.InetAddress;
import java.net.URL;
import java.net.UnknownHostException;
import java.util.List;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javax.swing.JOptionPane;
import model.Jogador;
import model.ListaJogadores;
import servidorRMI.AddObservadorImp;
import servidorRMI.ServerRMI;

/**
 *
 * @author Lucas Classe que faz o controller da tela de servidor online, esta
 * por sua vez possue uma textarea com os logs do sistema... um textfiel e um
 * butao fazem o controle de entrada de comando, simulando a ideia de um
 * terminal...
 */
public class ServerOlineController implements Initializable {

    private ServerRMI rmi = new ServerRMI();
    @FXML
    private TextArea txtLog;
    @FXML
    private TextField textComando;
    @FXML
    private Button btnDesligarServidor;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        try {
            rmi.startServerRMI(txtLog);
            txtLog.setText(">> Servidor ligado no IP: "
                    + InetAddress.getLocalHost().getHostAddress()
                    + "\n>> -- PORTA: 5555"
                    + "\n>> Aguardando Usuarios...");

            Tooltip t = new Tooltip("Clique aqui para desligar o servidor!");
            btnDesligarServidor.setTooltip(t);

        } catch (UnknownHostException ex) {
            txtLog.setText("FALHA NA LIGAÇÃO DO SERVIDOR!");
        }
    }

    /*
     * Tratamento do evento do botao desligar servidor...
     * aqui é fechado o serviço RMI...
     */
    @FXML
    public void desligaServidor() {
        int opcao;
        opcao = JOptionPane.showConfirmDialog(
                null, "Deseja deslugar o servidor?",
                "Comfirmar", JOptionPane.YES_NO_OPTION);
        if (opcao == JOptionPane.YES_OPTION) {
            rmi.desligarServerRMI();
        }
    }

    /*
     * Tratamento do comando digitado no textField... com base neste é realizado
     * alguns eventos pré-definidos
     */
    @FXML
    public void actionEnter() {
        String comando = textComando.getText().toLowerCase();
        if (!comando.equals("")) {
            txtLog.setText(txtLog.getText()
                    + "\n>>" + comando);
            switch (comando.toLowerCase()) {
                case ("ajuda"):
                    listarAjuda();
                    break;
                case ("?"):
                    listarAjuda();
                    break;
                case ("clear"):
                    txtLog.setText(">> Digite ajuda ou (?) para detalher!");
                    break;
                case ("listar"):
                    listarJogadores();
                    break;
                default:
                    txtLog.setText(txtLog.getText()
                            + "\n>> Comando não reconhecido! Digite ajuda ou (?) para detalhes!");
            }
            textComando.setText("");
            txtLog.positionCaret(Integer.MAX_VALUE);
        }
    }

    /*
     * Quando o usuario digita listar é apresentando na tela de log todos os 
     * jogadores cadastrados na lista....
     */
    private void listarJogadores() {
        ListaJogadores lj = ListaJogadores.getInstancia();
        List<Jogador> lista = lj.getListaJogadores();
        if (lj.getListaJogadores().isEmpty()) {
            txtLog.setText(txtLog.getText()
                    + "\n>> Não existe jogadores na lista!");
        } else {
            for (Jogador jogador : lista) {
                txtLog.setText(txtLog.getText()
                        + "\n>> Jogador: " + jogador.getName() 
                        + "Status: (" + jogador.getState().toString() + ")");
            }
        }
    }

    /*
     * Quando o usuario digita 'ajuda' ou '?' exibe uma lista com os comandos 
     * permitidos...
     */
    private void listarAjuda() {
        txtLog.setText(txtLog.getText()
                + "\n Comando: 'listar' para listar os jogadores!"
                + "\n Comando: 'clear' para limpar a tela de log!");
    }

    /*
     * Trata eventos do teclado... neste caso quando estiver com o cursor dentro
     * do campo de texto de comandos....
     */
    @FXML
    private void clicaTeclado(KeyEvent key) {
        if (key.getCode() == KeyCode.ENTER) {
            actionEnter();
        }
    }
}
